package com.yt.product.server.common.interceptor;

import com.yt.db.utils.RedisTokenUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @Description ：
 * @Author ： 解风
 * @Date ： 2017/11/28 09:39
 */
@Slf4j
@Configuration("productApiHandlerInterceptor")
public class ApiHandlerInterceptor implements HandlerInterceptor {


    @Autowired
    private RedisTokenUtil redisTokenUtil;

    /**
     * controller 执行之前调用
     * 只有返回true才会继续向下执行，返回false取消当前请求
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        response.setHeader("Access-Control-Allow-Origin", "*");//解决跨域
        //响应头设置
        response.setHeader("Access-Control-Allow-Headers", "Authorization,Content-type,Accept,X-Requested-With,sessionId,source,appVersion,Origin");
        //响应类型
        response.setHeader("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");


        String requestUrl = request.getRequestURI();

        // 1. 从请求头中获取 Authorization 字段（格式：Bearer token）
        String authorization = request.getHeader("Authorization");
        if(authorization != null && !authorization.isEmpty()){
            // 2. 验证 Authorization 格式
            if (!authorization.startsWith("Bearer ")) {
                response.setStatus(401); // 未授权
                return false; // 拦截请求，不继续向下执行
            }

            // 3. 提取 Token（去掉 "Bearer " 前缀）
            String token = authorization.substring(7);
            String userName = redisTokenUtil.validateToken(token);
            boolean isValid = redisTokenUtil.isTokenValid(token);
            long time = redisTokenUtil.getTokenRemainingTime(token);
            if(!isValid){
                response.setStatus(401); // Token 无效或过期
                return false;
            }
        }
        return true;
    }

    /**
     * controller 执行之后调用
     * 这个方法只会在当前这个Interceptor的preHandle方法返回值为true的时候才会执行。
     * postHandle是进行处理器拦截用的，它的执行时间是在处理器进行处理之后，也就是在Controller的方法调用之后执行，
     * 但是它会在DispatcherServlet进行视图的渲染之前执行，也就是说在这个方法中你可以对ModelAndView进行操作。
     * @param request
     * @param response
     * @param handler
     * @param modelAndView
     * @throws Exception
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, org.springframework.web.servlet.ModelAndView modelAndView) throws Exception {
//        if(handler instanceof HandlerMethod) {
//            HandlerMethod handlerMethod = (HandlerMethod) handler;
//            Method method = handlerMethod.getMethod();
//        }
    }

    /**
     * 该方法也是需要当前对应的Interceptor的preHandle方法的返回值为true时才会执行,
     * 该方法将在整个请求完成之后，也就是DispatcherServlet渲染了视图执行，这个方法的主要作用是用于清理资源的，
     * 当然这个方法也只能在当前这个Interceptor的preHandle方法的返回值为true时才会执行。
     * @param request
     * @param response
     * @param handler
     * @param ex
     * @throws Exception
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
//        CommonParameter.plintInfo();
    }
}